package userFav

import (
	protog "awesomeProject/goods-web/proto"
	"awesomeProject/userop-web/api"
	"awesomeProject/userop-web/forms"
	"awesomeProject/userop-web/global"
	"awesomeProject/userop-web/proto"
	"context"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"net/http"
	"strconv"
)

func List(ctx *gin.Context) {
	UserId, _ := ctx.Get("userId")

	// 不用判断权限，让管理员都获得收藏数据了么 ？

	favRsp, err := global.UserFavClient.GetFavList(context.Background(), &proto.UserFavRequest{
		UserId: int32(UserId.(uint)),
	})
	if err != nil {
		zap.S().Info("获取用户收藏列表失败")
		api.HandleGrpcErrorToHttp(err, ctx)
		return
	}
	// 获取收藏夹中的商品列表
	GoodIdList := make([]int32, 0)
	for _, data := range favRsp.Data {
		GoodIdList = append(GoodIdList, data.GoodsId)
	}
	if len(GoodIdList) == 0 {
		ctx.JSON(http.StatusOK, gin.H{
			"total": 0,
		})
		return
	}

	// 批量获取商品信息，需要在前端渲染出收藏夹内的商品数据
	goodsRsp, err := global.GoodsSrvClient.BatchGetGoods(context.Background(), &protog.BatchGoodsIdInfo{
		Id: GoodIdList,
	})
	if err != nil {
		zap.S().Info("获取收藏夹列表商品信息失败")
		api.HandleGrpcErrorToHttp(err, ctx)
		return
	}
	rspMap := make(map[string]interface{})
	// 总数就是收藏夹对应的数目
	rspMap["total"] = favRsp.Total

	goodsList := make([]interface{}, 0)
	// 读取商品列表
	for _, data := range goodsRsp.Data {
		goodInfo := make(map[string]interface{})
		goodInfo["id"] = data.Id
		goodInfo["name"] = data.Name
		goodInfo["shop_price"] = data.ShopPrice

		goodsList = append(goodsList, goodInfo)
	}
	rspMap["data"] = goodsList

	ctx.JSON(http.StatusOK, rspMap)
}

func Delete(ctx *gin.Context) {
	// 从请求参数url中获取对应商品ID
	goodsIdStr := ctx.Param("id")
	goodsId, err := strconv.ParseInt(goodsIdStr, 10, 32)
	if err != nil {
		zap.S().Info("解析url参数失败，不是int类型字符串")
		ctx.Status(http.StatusNotFound)
		return
	}
	// 从请求中解析userIf --- 核心通过token
	UserId, _ := ctx.Get("userId")

	_, err = global.UserFavClient.DeleteUserFav(context.Background(), &proto.UserFavRequest{
		UserId:  int32(UserId.(uint)),
		GoodsId: int32(goodsId),
	})
	if err != nil {
		zap.S().Info("删除收藏信息失败")
		api.HandleGrpcErrorToHttp(err, ctx)
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"msg": "删除成功",
	})
}

func Detail(ctx *gin.Context) { // 有问题！！！
	// 从请求参数url中获取对应商品ID
	goodsIdStr := ctx.Param("id")
	goodsId, err := strconv.ParseInt(goodsIdStr, 10, 32)
	if err != nil {
		zap.S().Info("解析url参数失败，不是int类型字符串")
		ctx.Status(http.StatusNotFound)
		return
	}
	// 从请求中解析userIf --- 核心通过token
	UserId, _ := ctx.Get("userId")

	_, err = global.UserFavClient.GetUserFavDetail(context.Background(), &proto.UserFavRequest{
		UserId:  int32(UserId.(uint)),
		GoodsId: int32(goodsId),
	})
	if err != nil {
		zap.S().Info("获取收藏商品详细信息失败")
		api.HandleGrpcErrorToHttp(err, ctx)
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"疑问": "后续这个接口是不是要重定向到对应goods的商品服务的url，不过这次查询成功",
	})
}

func New(ctx *gin.Context) {
	userFavForm := forms.UserFavForm{}
	if err := ctx.ShouldBind(&userFavForm); err != nil {
		api.HandleValidateError(err, ctx)
		return
	}

	userId, _ := ctx.Get("userId")
	_, err := global.UserFavClient.AddUserFav(context.Background(), &proto.UserFavRequest{
		UserId:  int32(userId.(uint)),
		GoodsId: userFavForm.GoodsId,
	})

	if err != nil {
		zap.S().Errorw("添加收藏记录失败")
		api.HandleGrpcErrorToHttp(err, ctx)
		return
	}

	ctx.JSON(http.StatusOK, gin.H{
		"msg": "添加成功",
	})
}
